
#include "communication.h"


uint8_t tx_address[5] = {0xc0,0xcc,0xcc,0xcc,0xcc};

/**
 * 1判断XN297L是否存在：存在则初始化；否则退出
 * 2读取flash，查看是否读取到：读不到使用默认地址，等待接收对频地址。 
 *  读取到则赋值地址，然后判断能否连上，连上则直接退出：
 * 	连不上先进入对频模式使用默认地址，再查看是否能连上，连上进入对频；
 *  连不上则使用flash地址退出
 */
void communJudgingXn297lExiststhenConnect(void)
{
    // memcpy(pXn297l->address, pFlashData->address, 5);
    // pXn297l->address[0] = 56;
    // pXn297l->channel = (pXn297l->address[0] % 60);
    pXn297l->check();   //判断是否存在xn297l

    if (pXn297l->status == SELF_OK)//存在xn297l
    {
        pXn297l->init();
        connectRemote();
    }
    else 
    {
        ;//错误，无法检测到xn297l
    }
}



/*
 *Input: void
 *Description: 对频遥控器，步骤如下
 *1、如果flash没值（value==0xffff），则地址用默认地址
 *2、如果使用了flash值，则判断n次是否与遥控通信上
 *3、n次后未连上，切换到默认地址，判断n次是否连上
 *4、默认地址连上，则记录新的地址值到flash，然后切换到新地址
 *5、默认地址未连上，则使用flash地址（地址有值的情况下）
 *Return: void
 */
void connectRemote(void)
{
	//本机地址
    uint8_t myAddress[5]={0};
	//flash没有存储地址时，使用默认地址
	readFlashData(myAddress, 5);
	if ((*myAddress == 0xff) && (*(myAddress + 1) == 0xff)&& (*(myAddress + 2) == 0xff))
	{
		if (bindRemote())
		{
			return;
		}
	}
	else
	{
		//falsh内存储有地址，使用该地址看能否连上遥控
        xn297lWriteBuf(W_REGISTER + TX_ADDR, myAddress, sizeof(myAddress));
        xn297lWriteBuf(W_REGISTER + RX_ADDR_P0,myAddress, sizeof(myAddress));

		uint8_t fhChannel = myAddress[0] % 60;
		xn297lSetChannel(fhChannel);
		uint8_t n = 200;
		uint8_t t_data[16] = {0};
		while (n--)
		{
			if(xn297lReadAndSend(t_data, t_data))
			{
				// 能连上则退出
				return;
			}
			delay(1);
		}
		//不能连上，则要判断遥控是否在对频模式
		if (bindRemote())
		{
			return;
		}
		else
		{
			// 不在对频模式则切回falsh的地址，等待后续的遥控连接
            xn297lWriteBuf(W_REGISTER + TX_ADDR, myAddress, sizeof(myAddress));
            xn297lWriteBuf(W_REGISTER + RX_ADDR_P0,myAddress, sizeof(myAddress));

			uint8_t fhChannel = myAddress[0] % 60;
			xn297lSetChannel(fhChannel);
		}
	}
}

// flash存储是以4Byte为单位的
static uint8_t DEFAULT_ADDRESS[8] = {'m', 'o', 'r', 'e', 'n'}; // 对码时的默认地址, 有效的是前面5位

//对频绑定遥控器
static uint8_t bindRemote(void)
{ 

    xn297lWriteBuf(W_REGISTER + TX_ADDR, DEFAULT_ADDRESS, sizeof(DEFAULT_ADDRESS));
    xn297lWriteBuf(W_REGISTER + RX_ADDR_P0,DEFAULT_ADDRESS, sizeof(DEFAULT_ADDRESS));

//	xn297lSetChannel(DEFAULT_CHANNEL);
    
	// 在n时间内对频遥控,成功则保存遥控发来的新地址，并切换为新地址
	uint8_t n = 200;
	uint8_t t_data[16] = {0};
	while (n--)
	{
		if (xn297lReadAndSend(t_data, t_data))//读取数据作为新地址
		{ 
            saveFlashData(t_data,5);

            xn297lWriteBuf(W_REGISTER + TX_ADDR, t_data, 5);
            xn297lWriteBuf(W_REGISTER + RX_ADDR_P0,t_data, 5);
			// 以第一个地址值作为新通道
			uint8_t fhChannel = t_data[0] % 60;
			xn297lSetChannel(fhChannel);
			return 1;
		}
		delay();
	}
	return 0;
}